home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
173
/
173.xpi
/
chrome
/
gm-notifier.jar
/
content
/
gm-notifier
/
gm-accounts.xul
< prev
next >
Wrap
Extensible Markup Language
|
2009-09-28
|
20KB
|
501 lines
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://gm-notifier/content/gm-notifier.css" type="text/css"?>
<!DOCTYPE dialog SYSTEM "chrome://gm-notifier/locale/gm-notifier.dtd">
<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="¬ifier.accounts.window.title;"
windowtype="gm-notifier:accounts"
buttons="accept"
style="padding:0px; margin:0px;"
ondialogaccept="onUnload()" ondialogcancel="onUnload()"
onunload="onUnload()" onload="start()">
<script type="application/x-javascript" src="chrome://gm-notifier/content/gm-prefs.js"/>
<script>
<![CDATA[
const kPSWDMANAGER_CONTRACTID = "@mozilla.org/passwordmanager;1";
const nsIPasswordManager = Components.interfaces.nsIPasswordManager;
const nsIPasswordManagerInternal = Components.interfaces.nsIPasswordManagerInternal;
const nsIGMNotifierProgressListener = Components.interfaces.nsIGMNotifierProgressListener;
var gPrefs;
var gHost = "chrome://gm-notifier/";
var gCurrentUser;
var gNotifierService = null;
var gNotifierProgressListener = null;
// 1: Edit, 2: New
var gMode;
function start() {
gNotifierService = Components.classes["@mozilla.org/GMailNotifier;1"].getService(Components.interfaces.nsIGMNotifierService);
// register listener
gNotifierProgressListener = new NotifierProgressListener();
gNotifierService.addListener(gNotifierProgressListener);
gPrefs = new gm_prefs();
toogleEditFields(false);
prefillAccounts();
}
var NotifierProgressListener = function() {
return ({
getID : function () { return null; },
onStateChange : function (aUsername, aState) {
var elm = document.getElementById("userstatus-"+aUsername);
if (!elm)
return;
var string = "";
if (aState == nsIGMNotifierProgressListener.LOGIN_INITIATED) {
string = getStringFromBundle("UserStateConnecting");
} else if (aState == nsIGMNotifierProgressListener.LOGIN_FAILED || aState == nsIGMNotifierProgressListener.LOGIN_DETAILS_INVALID || aState == nsIGMNotifierProgressListener.LOGIN_SUCCESS || aState == nsIGMNotifierProgressListener.LOGOUT_USER) {
var state = gNotifierService.getUserState(aUsername);
string = getStringForState(state);
if (aState == nsIGMNotifierProgressListener.LOGIN_SUCCESS)
document.getElementById("loggedin-"+aUsername).checked = true;
else
document.getElementById("loggedin-"+aUsername).checked = false;
}
if (string)
elm.setAttribute("value", string);
},
QueryInterface : function(aIID) {
if (aIID.equals(nsIGMNotifierProgressListener) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
}
});
}
function toogleEditFields(aEnabled) {
document.getElementById("username").disabled = !aEnabled;
document.getElementById("password").disabled = !aEnabled;
document.getElementById("autologin").disabled = !aEnabled;
document.getElementById("label1").disabled = !aEnabled;
document.getElementById("label2").disabled = !aEnabled;
document.getElementById("save-button").disabled = true;
}
function setupEditFields(aItem) {
var username = "", password = "", autologin = false;
if (aItem) {
username = aItem.firstChild.getAttribute("label");
password = gPasswordArray[username];
autologin = aItem.childNodes[2].firstChild.checked;
}
gCurrentUser = username;
document.getElementById("username").value = username;
document.getElementById("password").value = password;
document.getElementById("autologin").checked = autologin;
gMode = 1;
}
function selectionChanged(aListbox) {
var selectedItem = aListbox.selectedItem;
toogleEditFields(selectedItem ? true : false);
setupEditFields(selectedItem);
document.getElementById("removeButton").setAttribute("disabled", !selectedItem);
}
var gPasswordArray = new Array();
function getPassword(aUsername) {
if (Components.classes["@mozilla.org/login-manager;1"]) {
var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
var logins = passwordManager.findLogins({}, gHost, null, "gm-notifier");
for (var i = 0; i < logins.length; i++) {
if (logins[i].username == aUsername) {
var password = logins[i].password;
// XXX: why not call the service here to get password?
if (password === " ") {
// XXX: empty password is " " for now due to ff3 change
return "";
} else {
return password;
}
}
}
} else {
var passwordManager = Components.classes["@mozilla.org/passwordmanager;1"].createInstance(Components.interfaces.nsIPasswordManagerInternal);
var host = {value:""};
var user = {value:""};
var password = {value:""};
try {
passwordManager.findPasswordEntry(gHost, aUsername, "", host, user, password);
} catch(e){ }
return password.value;
}
}
function prefillAccounts() {
var user, password, state;
var userlist = document.getElementById("userlist");
var count = gNotifierService.getUserCount();
for (var i = 0; i < count; i++) {
user = gNotifierService.getUserName(i);
password = getPassword(user);
state = gNotifierService.getUserState(user);
gPasswordArray[user] = password;
// check user prefs
var autologin = gPrefs.getBoolPref("gm-notifier.userlist." + user + ".autologin");
var loggedin = (state == gNotifierService.USER_STATE_LOGGED_IN);
userlist.appendChild(createListItem(user, autologin, loggedin, state));
}
}
function createListItem(aUsername, aAutoLogin, aIsLoggedIn, aState) {
var listitem = document.createElement("listitem");
listitem.setAttribute("allowevents", "true");
var listcell = document.createElement("listcell");
listcell.setAttribute("label", aUsername);
listitem.appendChild(listcell);
listcell = document.createElement("listcell");
listcell.setAttribute("pack", "center");
var checkbox = document.createElement("checkbox");
checkbox.setAttribute("id", "loggedin-"+aUsername);
checkbox.setAttribute("oncommand", "loggedinChanged(this, \""+aUsername+"\")");
checkbox.setAttribute("checked", (aIsLoggedIn == null ? false : aIsLoggedIn));
listcell.appendChild(checkbox);
listitem.appendChild(listcell);
listcell = document.createElement("listcell");
listcell.setAttribute("pack", "center");
checkbox = document.createElement("checkbox");
checkbox.setAttribute("oncommand", "autologinChanged(this, \""+aUsername+"\")");
checkbox.setAttribute("checked", (aAutoLogin == null ? false : aAutoLogin));
listcell.appendChild(checkbox);
listitem.appendChild(listcell);
listcell = document.createElement("listcell");
var label = document.createElement("label");
label.setAttribute("value", getStringForState(aState));
label.setAttribute("id", "userstatus-"+aUsername);
listcell.appendChild(label);
listitem.appendChild(listcell);
return listitem;
}
function getStringFromBundle(aName) {
var strbundle = document.getElementById("stringbundle");
return strbundle.getString(aName);
}
function getStringForState(aState) {
var value = "";
if (aState == gNotifierService.USER_STATE_LOGGED_IN) {
value = getStringFromBundle("LoggingStatusLoggedIn");
} else if (aState == gNotifierService.USER_STATE_LOGGED_OUT) {
value = getStringFromBundle("UserStateLoggedOut");
} else if (aState == gNotifierService.USER_STATE_INVALID_DETAILS) {
value = getStringFromBundle("UserStateInvalidDetails");
}
return value;
}
function deleteAccount() {
var userlist = document.getElementById("userlist");
if (!userlist.selectedItem)
return;
var username = userlist.selectedItem.firstChild.getAttribute("label");
var shouldDelete = confirm("Are you sure you want to delete the account \"" + username + "\"?");
if (shouldDelete) {
deleteUsername(username);
userlist.removeItemAt(userlist.selectedIndex)
gPasswordArray[username] = null;
deleteUsername(username);
gPrefs.clearPref("gm-notifier.userlist." + username + ".autologin");
gPrefs.clearPref("gm-notifier.userlist." + username + ".loggedin");
}
}
function deleteUsername(aUsername) {
try {
if (Components.classes["@mozilla.org/login-manager;1"]) {
var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
var passwords = passwordManager.findLogins({}, gHost, null, "gm-notifier");
for (var i = 0; i < passwords.length; i++) {
if (passwords[i].username == aUsername) {
passwordManager.removeLogin(passwords[i]);
break;
}
}
} else {
var passwordManager = Components.classes[kPSWDMANAGER_CONTRACTID]
.createInstance(nsIPasswordManager);
passwordManager.removeUser(gHost, aUsername);
}
} catch (e) {}
gNotifierService.removeUser(aUsername);
}
function addUsername(aUsername, aPassword) {
try {
if (Components.classes["@mozilla.org/login-manager;1"]) {
var logininfo = Components.classes["@mozilla.org/login-manager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
logininfo.init(gHost, null, "gm-notifier", aUsername, aPassword, "", "");
passwordManager.addLogin(logininfo);
} else {
var passwordManager = Components.classes[kPSWDMANAGER_CONTRACTID]
.createInstance(nsIPasswordManager);
passwordManager.addUser(gHost, aUsername, aPassword);
}
} catch (e) {}
}
function updatePassword(aUsername, aPassword) {
try {
if (Components.classes["@mozilla.org/login-manager;1"]) {
var loginManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
var passwords = loginManager.findLogins({}, gHost, null, "gm-notifier");
for (var i = 0; i < passwords.length; i++) {
if (passwords[i].username == aUsername) {
var logininfo = Components.classes["@mozilla.org/login-manager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
logininfo.init(gHost, null, "gm-notifier", aUsername, aPassword, "", "");
loginManager.modifyLogin(passwords[i], logininfo);
break;
}
}
} else {
var passwordManager = Components.classes[kPSWDMANAGER_CONTRACTID]
.createInstance(nsIPasswordManager);
try {
passwordManager.removeUser(gHost, aUsername);
} catch (e) {}
passwordManager.addUser(gHost, aUsername, aPassword);
}
} catch (e) {}
}
function addUser() {
toogleEditFields(true);
setupEditFields();
// disable save button untill all data is there
document.getElementById("save-button").disabled = true;
// focus the username field
document.getElementById("username").focus();
gMode = 2;
}
function updateSaveButton() {
// check if username/password ain't empty
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
if (username.length > 0 && password.length > 0)
document.getElementById("save-button").disabled = false;
else
document.getElementById("save-button").disabled = true;
}
function doSaveUser() {
var userlist = document.getElementById("userlist");
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
var autologin = document.getElementById("autologin").checked;
// 1: Edit, 2: New
if (gMode == 1) {
// check if the username changed
if (username != gCurrentUser) {
// check if the username already exists
if (gPasswordArray[username]) {
alert("User \"" + username + "\" already exists!")
return;
}
// delete old user
deleteUsername(gCurrentUser);
gPasswordArray[gCurrentUser] = null;
gPrefs.clearPref("gm-notifier.userlist." + gCurrentUser + ".autologin");
gPrefs.clearPref("gm-notifier.userlist." + gCurrentUser + ".loggedin");
}
// update user
updatePassword(username, password);
gPasswordArray[username] = password;
gPrefs.setBoolPref("gm-notifier.userlist." + username + ".autologin", autologin);
gPrefs.setBoolPref("gm-notifier.userlist." + username + ".loggedin", false);
userlist.selectedItem.firstChild.setAttribute("label", username);
userlist.selectedItem.childNodes[2].firstChild.setAttribute("checked", autologin);
// XXX: what if user is logged in?
} else if (gMode == 2) {
// check if username exists
if (gPasswordArray[username]) {
alert("User \"" + username + "\" already exists!")
return;
}
// add user to the password manager
addUsername(username, password);
gPasswordArray[username] = password;
// set per-account preference
gPrefs.setBoolPref("gm-notifier.userlist." + username + ".autologin", autologin);
gPrefs.setBoolPref("gm-notifier.userlist." + username + ".loggedin", false);
userlist.appendChild(createListItem(username, autologin, false, gNotifierService.USER_STATE_LOGGED_OUT));
userlist.selectedIndex = userlist.getRowCount() - 1;
gNotifierService.addUser(username);
}
// saved, so disable button
document.getElementById("save-button").disabled = true;
}
function autologinChanged(aCheckbox, aUsername) {
// force selection
document.getElementById("userlist").selectedItem = aCheckbox.parentNode.parentNode;
document.getElementById("autologin").checked = aCheckbox.checked;
// save
doSaveUser();
}
function loggedinChanged(aCheckbox, aUsername) {
if (aCheckbox.checked) {
// since the accounts window can be opened from the prefs window by
// the user by checking the multi-account checkbox (which won't change
// the underlying pref untill you press ok on that page), we make sure
// that the multi-account pref is true when we log in a user.
if (!gPrefs.getBoolPref("gm-notifier.multiaccount.enabled")) {
gPrefs.setBoolPref("gm-notifier.multiaccount.enabled", true);
}
gNotifierService.loginUser(aUsername);
} else {
gNotifierService.logoutUser(aUsername);
}
}
function onDestroy() {
onUnload();
window.close();
}
function onUnload() {
// unregister listener
if (gNotifierProgressListener)
gNotifierService.removeListener(gNotifierProgressListener);
// cleanup
gNotifierProgressListener = null;
gNotifierService = null;
gPrefs = null;
}
]]>
</script>
<stringbundle id="stringbundle" src="chrome://gm-notifier/locale/gm-notifier.properties"/>
<description value="¬ifier.accounts.window.title;" class="notifier-dialog-title"
style="min-width:400px; margin-bottom: 10px;"/>
<hbox flex="1">
<vbox flex="1">
<listbox id="userlist" flex="1" onselect="selectionChanged(this)">
<listhead>
<listheader label="¬ifier.accounts.listheader.username.label;"/>
<listheader label="¬ifier.accounts.listheader.online.label;"/>
<listheader label="¬ifier.accounts.listheader.autologin.label;"/>
<listheader label="¬ifier.accounts.listheader.status.label;"/>
</listhead>
<listcols>
<listcol flex="10"/>
<listcol flex="1"/>
<listcol flex="1"/>
<listcol flex="1"/>
</listcols>
</listbox>
<groupbox>
<caption label="¬ifier.accounts.groupbox.label;"/>
<grid flex="1">
<columns>
<column/>
<column flex="1"/>
</columns>
<rows>
<row align="center">
<label id="label1"
value="¬ifier.accounts.grid.username.label;"
accesskey="¬ifier.accounts.grid.username.accesskey;"
control="username"/>
<textbox onkeyup="updateSaveButton()" id="username" tabindex="1"/>
<button id="save-button" icon="save"
label="¬ifier.accounts.grid.username.save.label;"
accesskey="¬ifier.accounts.grid.username.save.accesskey;"
oncommand="doSaveUser()" tabindex="4"/>
</row>
<row align="center">
<label id="label2"
value="¬ifier.accounts.grid.username.password.label;"
accesskey="¬ifier.accounts.grid.username.password.accesskey;"
control="password"/>
<textbox id="password" onkeyup="updateSaveButton()" type="password" tabindex="2"/>
</row>
<checkbox id="autologin"
label="¬ifier.accounts.grid.autologin.label;"
accesskey="¬ifier.accounts.grid.autologin.accesskey;"
tabindex="3"/>
</rows>
</grid>
</groupbox>
</vbox>
<vbox>
<button label="¬ifier.accounts.buttons.add.label;"
accesskey="¬ifier.accounts.buttons.add.accesskey;"
icon="add" oncommand="addUser()"/>
<button label="¬ifier.accounts.buttons.remove.label;"
id="removeButton" disabled="true"
accesskey="¬ifier.accounts.buttons.remove.accesskey;"
icon="remove" oncommand="deleteAccount()"/>
</vbox>
</hbox>
</dialog>